package com.agile.leetcode.collection;

import org.junit.Test;

import java.util.*;

/**
 * @Author KD
 * @Date 2021/3/4 16:58
 */
@SuppressWarnings("all")
public class CollectionDemo {
    /**
     * 排序
     */
    @Test
    public void test1() {
        List<String> list = new ArrayList<>(10);
        list.add("5");
        list.add("3");
        list.add("4");
        // 正序
        Collections.sort(list);
        System.out.println(list);
        // 逆序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        System.out.println(list);
        Collections.sort(list);
        // 逆序
        Collections.sort(list, Collections.reverseOrder());
        System.out.println(list);
    }

    /**
     * 二分查找
     */
    @Test
    public void test_binarySearch() {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        list.add("8");

        int idx = Collections.binarySearch(list, "5");
        System.out.println("二分查找：" + idx);
    }

    /**
     * 打乱集合顺序的实现
     */
    @Test
    public void test_shuffle() {
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        list.add("8");

        Random random = new Random();
        for (int i = list.size(); i > 1; i--) {
            int ri = random.nextInt(i);  // 随机位置
            int ji = i - 1;              // 顺延
            System.out.println("ri：" + ri + " ji：" + ji);
            list.set(ji, list.set(ri, list.get(ji)));        // 元素置换
        }
        System.out.println(list);
        Collections.shuffle(list);
        System.out.println(list);
    }

    /**
     * 旋转
     */
    @Test
    public void test3() {
        List<String> list = new ArrayList<String>();
        list.add("7");
        list.add("4");
        list.add("8");
        list.add("3");
        list.add("9");
        // 顺时针旋转两位
        Collections.rotate(list, 2);
        System.out.println(list);
        Collections.rotate(list, -2);
        // 逆时针宣传两位
        System.out.println(list);
    }

    /**
     * 最值判断
     */
    @Test
    public void test4() {
        // 最小值的获取
        System.out.println(Collections.min(Arrays.asList(1, 2, 3)));
        // 最大值的获取
        System.out.println(Collections.max(Arrays.asList(1, 2, 3)));
    }

    /**
     * 连续集合的判断
     */
    @Test
    public void test_indexOfSubList() {
        List<String> list = new ArrayList<String>();
        list.add("7");
        list.add("4");
        list.add("8");
        list.add("3");
        list.add("9");
        // 3 9 是子集合，返回3的索引
        // 如果不是子集合，则会返回-1
        int idx = Collections.indexOfSubList(list, Arrays.asList("3", "9"));
        System.out.println(idx);

        // 测试结果：2
    }

    /**
     * 得到线程安全的集合
     */
    @Test
    public void test5() {
        List<String> list = Collections.synchronizedList(new ArrayList<String>());
        Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());
        System.out.println(map.getClass());
    }

    /**
     * 交换集合中两个数的值
     */
    @Test
    public void test6() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        // 交换值
        Collections.swap(list, 0, list.size() - 1);
        System.out.println(list);
    }
}
